package ar.com.jsejtman.common.mail.entity;

import ar.com.jsejtman.common.domain.entity.Identifiable;
import ar.com.jsejtman.common.domain.entity.IdentifiableComparer;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Version;

/**
 * Configuración de servidor de Email.
 * 
 * @author jsejtman
 */
@Entity
@Table(name = "email_server_configuration")
public class EmailServerConfiguration implements Identifiable<Long> {

	/**
	 * Identificador de la autoridad.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Long id;

	/**
	 * Usuario de la conexión.
	 */
	@Column(name = "username", nullable = false)
	private String username;

	/**
	 * Clave de la conexión.
	 */
	@Column(name = "password", nullable = false)
	private String password;

	/**
	 * Dirección IP del servidor.
	 */
	@Column(name = "host_address", nullable = false)
	private String hostAddress;

	/**
	 * Puerto del servidor.
	 */
	@Column(name = "port", nullable = false)
	private Integer port;

	/**
	 * Puerto del servidor.
	 */
	@Column(name = "ssl_required", nullable = false)
	private boolean sslRequired;

	/**
	 * Número de versión de la entidad (para evitar escrituras concurrentes).
	 */
	@Version
	@Column(name = "version", nullable = false)
	private Long version;

	/**
	 * Devuelve el valor de id.
	 * 
	 * @return El valor de id.
	 */
	public final Long getId() {

		return (this.id);
	}

	/**
	 * Asigna un nuevo valor a id.
	 * 
	 * @param id El valor a asignar a id.
	 */
	protected final void setId(final Long id) {

		this.id = id;
	}

	/**
	 * Devuelve el valor de username.
	 * 
	 * @return El valor de username.
	 */
	public final String getUsername() {

		return (this.username);
	}

	/**
	 * Asigna un nuevo valor a username.
	 * 
	 * @param username El valor a asignar a username.
	 */
	public final void setUsername(final String username) {

		this.username = username;
	}

	/**
	 * Devuelve el valor de password.
	 * 
	 * @return El valor de password.
	 */
	public final String getPassword() {

		return (this.password);
	}

	/**
	 * Asigna un nuevo valor a password.
	 * 
	 * @param password El valor a asignar a password.
	 */
	public final void setPassword(final String password) {

		this.password = password;
	}

	/**
	 * Devuelve el valor de hostAddress.
	 * 
	 * @return El valor de hostAddress.
	 */
	public final String getHostAddress() {

		return (this.hostAddress);
	}

	/**
	 * Asigna un nuevo valor a hostAddress.
	 * 
	 * @param hostAddress El valor a asignar a hostAddress.
	 */
	public final void setHostAddress(final String hostAddress) {

		this.hostAddress = hostAddress;
	}

	/**
	 * Devuelve el valor de port.
	 * 
	 * @return El valor de port.
	 */
	public final Integer getPort() {

		return (this.port);
	}

	/**
	 * Asigna un nuevo valor a port.
	 * 
	 * @param port El valor a asignar a port.
	 */
	public final void setPort(final Integer port) {

		this.port = port;
	}

	/**
	 * Devuelve el valor de sslRequired.
	 * 
	 * @return El valor de sslRequired.
	 */
	public final boolean isSslRequired() {

		return (this.sslRequired);
	}

	/**
	 * Asigna un nuevo valor a sslRequired.
	 * 
	 * @param sslRequired El valor a asignar a sslRequired.
	 */
	public final void setSslRequired(final boolean sslRequired) {

		this.sslRequired = sslRequired;
	}

	/**
	 * Devuelve el valor de version.
	 * 
	 * @return El valor de version.
	 */
	protected final Long getVersion() {

		return (this.version);
	}

	/**
	 * Asigna un nuevo valor a version.
	 * 
	 * @param version El valor a asignar a version.
	 */
	protected final void setVersion(final Long version) {

		this.version = version;
	}

	@Override
	public final int hashCode() {

		return ((this.id == null) ? 0 : this.id.hashCode());
	}

	@SuppressWarnings("unchecked")
	@Override
	public final boolean equals(final Object obj) {

		return (IdentifiableComparer.equals(this, (Identifiable<Serializable>) obj));
	}
}
